home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2005 October / PCWOCT05.iso / Software / FromTheMag / XAMPP 1.4.14 / xampp-win32-1.4.14-installer.exe / xampp / php / pear / Config / Container / IniFile.php < prev    next >
PHP Script  |  2004-10-01  |  6KB  |  162 lines

  1. <?php
  2. // +----------------------------------------------------------------------+
  3. // | PHP Version 4                                                        |
  4. // +----------------------------------------------------------------------+
  5. // | Copyright (c) 1997-2003 The PHP Group                                |
  6. // +----------------------------------------------------------------------+
  7. // | This source file is subject to version 2.0 of the PHP license,       |
  8. // | that is bundled with this package in the file LICENSE, and is        |
  9. // | available at through the world-wide-web at                           |
  10. // | http://www.php.net/license/2_02.txt.                                 |
  11. // | If you did not receive a copy of the PHP license and are unable to   |
  12. // | obtain it through the world-wide-web, please send a note to          |
  13. // | license@php.net so we can mail you a copy immediately.               |
  14. // +----------------------------------------------------------------------+
  15. // | Authors: Bertrand Mansion <bmansion@mamasam.com>                     |
  16. // +----------------------------------------------------------------------+
  17. //
  18. // $Id: IniFile.php,v 1.14 2003/11/29 09:31:26 mansion Exp $
  19.  
  20. /**
  21. * Config parser for PHP .ini files
  22. * Faster because it uses parse_ini_file() but get rid of comments,
  23. * quotes, types and converts On, Off, True, False, Yes, No to 0 and 1.
  24. *
  25. * @author      Bertrand Mansion <bmansion@mamasam.com>
  26. * @package     Config
  27. */
  28. class Config_Container_IniFile {
  29.  
  30.     /**
  31.     * This class options
  32.     * Not used at the moment
  33.     *
  34.     * @var  array
  35.     */
  36.     var $options = array();
  37.  
  38.     /**
  39.     * Constructor
  40.     *
  41.     * @access public
  42.     * @param    string  $options    (optional)Options to be used by renderer
  43.     */
  44.     function Config_Container_IniFile($options = array())
  45.     {
  46.         $this->options = $options;
  47.     } // end constructor
  48.  
  49.     /**
  50.     * Parses the data of the given configuration file
  51.     *
  52.     * @access public
  53.     * @param string $datasrc    path to the configuration file
  54.     * @param object $obj        reference to a config object
  55.     * @return mixed    returns a PEAR_ERROR, if error occurs or true if ok
  56.     */
  57.     function &parseDatasrc($datasrc, &$obj)
  58.     {
  59.         if (!file_exists($datasrc)) {
  60.             return PEAR::raiseError("Datasource file does not exist.", null, PEAR_ERROR_RETURN);
  61.         }
  62.         $currentSection =& $obj->container;
  63.         $confArray = parse_ini_file($datasrc, true);
  64.         if (!$confArray) {
  65.             return PEAR::raiseError("File '$datasrc' does not contain configuration data.", null, PEAR_ERROR_RETURN);
  66.         }
  67.         foreach ($confArray as $key => $value) {
  68.             if (is_array($value)) {
  69.                 $currentSection =& $obj->container->createSection($key);
  70.                 foreach ($value as $directive => $content) {
  71.                     // try to split the value if comma found
  72.                     if (strpos($content, '"') === false) {
  73.                         $values = preg_split('/\s*,\s+/', $content);
  74.                         if (count($values) > 1) {
  75.                             foreach ($values as $k => $v) {
  76.                                 $currentSection->createDirective($directive, $v);
  77.                             }
  78.                         } else {
  79.                             $currentSection->createDirective($directive, $content);
  80.                         }
  81.                     } else {
  82.                         $currentSection->createDirective($directive, $content);
  83.                     }
  84.                 }
  85.             } else {
  86.                 $currentSection->createDirective($key, $value);
  87.             }
  88.         }
  89.         return true;
  90.     } // end func parseDatasrc
  91.  
  92.     /**
  93.     * Returns a formatted string of the object
  94.     * @param    object  $obj    Container object to be output as string
  95.     * @access   public
  96.     * @return   string
  97.     */
  98.     function toString(&$obj)
  99.     {
  100.         static $childrenCount, $commaString;
  101.  
  102.         if (!isset($string)) {
  103.             $string = '';
  104.         }
  105.         switch ($obj->type) {
  106.             case 'blank':
  107.                 $string = "\n";
  108.                 break;
  109.             case 'comment':
  110.                 $string = ';'.$obj->content."\n";
  111.                 break;
  112.             case 'directive':
  113.                 $count = $obj->parent->countChildren('directive', $obj->name);
  114.                 $content = $obj->content;
  115.                 if ($content === false) {
  116.                     $content = '0';
  117.                 } elseif ($content === true) {
  118.                     $content = '1';
  119.                 } elseif (strlen(trim($content)) < strlen($content) ||
  120.                           strpos($content, ',') !== false ||
  121.                           strpos($content, ';') !== false ||
  122.                           strpos($content, '"') !== false ||
  123.                           strpos($content, '%') !== false) {
  124.                     $content = '"'.addslashes($content).'"';          
  125.                 }
  126.                 if ($count > 1) {
  127.                     // multiple values for a directive are separated by a comma
  128.                     if (isset($childrenCount[$obj->name])) {
  129.                         $childrenCount[$obj->name]++;
  130.                     } else {
  131.                         $childrenCount[$obj->name] = 0;
  132.                         $commaString[$obj->name] = $obj->name.'=';
  133.                     }
  134.                     if ($childrenCount[$obj->name] == $count-1) {
  135.                         // Clean the static for future calls to toString
  136.                         $string .= $commaString[$obj->name].$content."\n";
  137.                         unset($childrenCount[$obj->name]);
  138.                         unset($commaString[$obj->name]);
  139.                     } else {
  140.                         $commaString[$obj->name] .= $content.', ';
  141.                     }
  142.                 } else {
  143.                     $string = $obj->name.'='.$content."\n";
  144.                 }
  145.                 break;
  146.             case 'section':
  147.                 if (!$obj->isRoot()) {
  148.                     $string = '['.$obj->name."]\n";
  149.                 }
  150.                 if (count($obj->children) > 0) {
  151.                     for ($i = 0; $i < count($obj->children); $i++) {
  152.                         $string .= $this->toString($obj->getChild($i));
  153.                     }
  154.                 }
  155.                 break;
  156.             default:
  157.                 $string = '';
  158.         }
  159.         return $string;
  160.     } // end func toString
  161. } // end class Config_Container_IniFile
  162. ?>